gdk: Ensure that GdkPointerWindowInfo is only generated for pointers
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 6 Dec 2011 19:29:22 +0000 (20:29 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 24 Feb 2012 03:11:17 +0000 (22:11 -0500)
gdk/gdkdisplay.c
gdk/gdkwindow.c

index 702f6b4891cd89a38c3c3118d09efbd26b0782ce..b2d65d2a13f4fdcb292c6330c1d20edb6de9ee8c 100644 (file)
@@ -1120,6 +1120,9 @@ _gdk_display_get_pointer_info (GdkDisplay *display,
 {
   GdkPointerWindowInfo *info;
 
+  if (device && gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
+    device = gdk_device_get_associated_device (device);
+
   if (G_UNLIKELY (!device))
     return NULL;
 
index 1d1e6d05e72d96960493655320e1237d9f78c59a..d3d96bc18f9e1e62e3a9d70e6333d685e4f0b2cc 100644 (file)
@@ -9571,10 +9571,10 @@ _gdk_windowing_got_event (GdkDisplay *display,
     {
       GdkInputMode mode;
 
-      pointer_info = _gdk_display_get_pointer_info (display, device);
-
-      if (pointer_info)
+      if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD)
         {
+          pointer_info = _gdk_display_get_pointer_info (display, device);
+
           if (source_device != pointer_info->last_slave &&
               gdk_device_get_device_type (source_device) == GDK_DEVICE_TYPE_SLAVE)
             pointer_info->last_slave = source_device;
@@ -9684,15 +9684,19 @@ _gdk_windowing_got_event (GdkDisplay *display,
        }
     }
 
-  /* Store last pointer window and position/state */
-  old_state = pointer_info->state;
-  old_button = pointer_info->button;
+  if (pointer_info)
+    {
+      /* Store last pointer window and position/state */
+      old_state = pointer_info->state;
+      old_button = pointer_info->button;
+
+      gdk_event_get_coords (event, &x, &y);
+      convert_native_coords_to_toplevel (event_window, x, y,  &x, &y);
+      pointer_info->toplevel_x = x;
+      pointer_info->toplevel_y = y;
+      gdk_event_get_state (event, &pointer_info->state);
+    }
 
-  gdk_event_get_coords (event, &x, &y);
-  convert_native_coords_to_toplevel (event_window, x, y,  &x, &y);
-  pointer_info->toplevel_x = x;
-  pointer_info->toplevel_y = y;
-  gdk_event_get_state (event, &pointer_info->state);
   if (event->type == GDK_BUTTON_PRESS ||
       event->type == GDK_BUTTON_RELEASE)
     pointer_info->button = event->button.button;